/*
 *  ajax请求
 *
 * @Author:    1024创新实验室-主任：卓大
 * @Date:      2022-09-06 20:46:03
 * @Wechat:    zhuda1024
 * @Email:     lab1024@163.com
 * @Copyright  1024创新实验室 （ https://1024lab.net ），Since 2012
 */

import axios, {AxiosRequestConfig} from 'axios';
import {localRead} from '@/utils/local-util.ts';
import {localClear} from '@/utils/local-util';
// token的消息头
const TOKEN_HEADER: string = 'authorization';
// 使用环境变量配置 baseURL
const baseURL = import.meta.env.VITE_SERVE;
// 创建axios对象
const smartAxios = axios.create({
    baseURL: baseURL
});

// 退出系统
function logout() {
    localClear();
    location.href = '/';
}

// ================================= 请求拦截器 =================================

smartAxios.interceptors.request.use(
    (config) => {
        // 在发送请求之前消息头加入token token
        const token = localRead("smart_admin_user_token");
        if (token) {
            config.headers[TOKEN_HEADER] = token;
        } else {
            delete config.headers[TOKEN_HEADER];
        }
        return config;
    },
    (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// ================================= 响应拦截器 =================================

// 添加响应拦截器
smartAxios.interceptors.response.use(
    (response) => {
        // 根据content-type ，判断是否为 json 数据
        let contentType = response.headers['content-type'] ? response.headers['content-type'] : response.headers['Content-Type'];
        if (contentType.indexOf('application/json') === -1) {
            return Promise.resolve(response);
        }

        // 如果是json数据
        if (response.data && response.data instanceof Blob) {
            return Promise.reject(response.data);
        }
        // 对响应数据做点什么
        const res = response.data;
        if (res.code && res.code !== 1) {
            // `token` 过期或者账号已在别处登录
            if (res.code === 30007 || res.code === 30008) {
                localClear();
                //跳转到登录页面，直接使用页面刷新的策略
                setTimeout(() => {
                    location.href = '/';
                }, 300);
                return Promise.reject(response);
            }

            // 等保安全的登录提醒
            if (res.code === 30010 || res.code === 30011) {
                return Promise.reject(response);
            }

            // 长时间未操作系统，需要重新登录
            if (res.code === 30012) {
                setTimeout(logout, 3000);
                return Promise.reject(response);
            }
            return Promise.reject(response);
        } else {
            return Promise.resolve(res);
        }
    },
);

// ================================= 对外提供请求方法：通用请求，get， post, =================================

/**
 * 通用请求封装
 * @param config
 */
export const request = <T = any>(config: AxiosRequestConfig): Promise<T> => {
    return smartAxios.request(config);
};

/**
 * post请求
 */
export const postRequest = <T = any>(url: string, data: any): Promise<T> => {
    return request({data, url, method: 'post'});
};

/**
 * get请求
 */
export const getRequest = <T = any>(url: string, params?: any): Promise<T> => {
    return request({url, method: 'get', params});
};

